package com.wy.thread_pool;

import java.util.Scanner;
import java.util.concurrent.*;

/**
 * @author 美女
 * @date 2022/05/03 12:14
 **/
public class Demo {
    public static void main(String[] args) {
        BlockingQueue<Runnable> queue=new ArrayBlockingQueue<>(1);//队列容量为3
        //线程工厂的使用-给线程可以起名
        ThreadFactory tf=new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                Thread t=new Thread(r,"饭店厨师");//介入到线程中给线程起名了，这样我们创建出来的线程都叫饭店厨师了
                return t;
            }
        };

        ExecutorService service=new ThreadPoolExecutor(
                3,//正式员工
                9,//所有员工-》推出临时员工6个
                10, TimeUnit.SECONDS,//临时工最多可以休眠十秒钟
                queue,
                tf,
                new ThreadPoolExecutor.AbortPolicy()//拒绝策略
        );

        //提前定义好任务
        Runnable task=new Runnable() {
            @Override
            public void run() {
                try {
                    TimeUnit.DAYS.sleep(365);//让任务休眠一年-便于看到雇佣员工的过程在往下走
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        };

        Scanner scanner=new Scanner(System.in);//定义scanner只是方便观察现象
        //把任务直接提交给线程池对象（想象成一个公司/组织）
        for(int i=0;i<100;i++) {//不断提交任务，每个任务都是一个做不完的任务（任务休眠一年）
            scanner.nextLine();//输入一个字符，执行一次任务（为了便于在jConsole观察任务执行到满员实行拒绝策略抛出异常的现象）
            service.execute(task);
        }

    }
}
